package com.ihrm.handler;

import com.ihrm.common.entity.Result;
import com.ihrm.exception.CommonException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 自定义全局异常处理器
 *     // @ControllerAdvice 是 Spring MVC 提供的一个注解，用于定义一个全局的控制器增强类（Advice），
 *     它可以为多个控制器提供统一的异常处理、数据绑定、验证处理等功能。它通常用于实现全局异常处理、
 *     统一数据预处理或后处理等跨切面逻辑。 作用：
 *                      1. 全局异常处理：捕获控制器中抛出的所有异常，并进行统一的处理
 *                      2. 数据预处理：在控制器方法执行之前，对数据进行一些预处理
 *                      3. 数据后处理：在控制器方法执行之后，对数据进行一些后处理
 *                      4. 跨控制器逻辑：在多个控制器之间共享一些公共的逻辑处理
 *
 * @ExceptionHandler 是一个方法级别的注解，用于定义一个异常处理器。它允许你捕获并处理特定类型的异常，
 * 并返回一个自定义的响应。
 * @ResponseBody 是一个方法级别的注解，用于将方法的返回值直接写入 HTTP 响应体中。
 * 它通常用于返回 JSON 或 XML 格式的响应。
 * @ResponseStatus 是 Spring MVC 提供的一个注解，用于指定一个方法或异常类的 HTTP 响应状态码。
 * 它通常用于控制器方法或全局异常处理器中，以便在处理请求或捕获异常时返回特定的 HTTP 状态码。
 *
 */
@ControllerAdvice
public class BaseExceptionHandler {
    @ExceptionHandler(value  = {Exception.class})
    @ResponseBody
    public Result error(HttpServletRequest request, HttpServletResponse response,Exception e) {  // 出现异常使用error方法处理
        if (e.getClass() == CommonException.class) {
            CommonException ce = (CommonException) e;
            Result result = new Result(ce.getResultCode());
            return result;
        }else {
            Result result = new Result();
            result.setSuccess(false);
            result.setMessage("服务器内部错误");
            return result;
        }

    }

}


